iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 1
8

組合語言是最接近底層的語言,雖然現在用到的地方越來越少,連韌體都可以用 C 語言來寫,但我認為學習底層語言對寫程式還是有幫助的,可以藉由學習組合語言更了解電腦核心的運作方式,程式經過編譯後產生的指令是如何載入記憶體並被 CPU 執行,如此我們便能用更接近機器的思維來寫其他高階的程式語言。

學習組合語言也是希望自己能看懂反組譯出來的程式碼,在網路上看到介紹程式底層的文章大多會涉及組合語言,每次因為看不懂而無法更深入理解,就會覺得非常可惜,因此決定趁這個機會好好學習這門艱澀難懂的技術,就讓我們開始吧。

本系列文章主要介紹 8086 CPU 下的 16 位元 DOS 組合語言,8086 雖然是 16 位元的 CPU 但和現代 CPU 結構上差異不大,適合初學者學習,有 16 位元的基礎後,再學 32 和 64 位元很快就能上手,就和第一個程式語言總是特別難學一樣。

環境安裝

組合語言的原始碼需要經過 組譯連結 才會變成 .exe 執行檔。

組譯和Debug相關程式

  • masm.exe: 將 .asm 組譯成 .obj 檔案
  • link.exe: 將 .obj 檔案連結後變成 .exe 執行檔
  • ml.exe: masm.exe + link.exe 方便我們快速組譯和連結
  • dosxnt.exe: 使用 masm.exe 組譯時需要
  • debug.exe: debug 會用到

前四個我是到這個 網站 下載,網站左邊選單 相關檔案下載 內的 Bin.zip

debug.exe Win10 環境已經沒有,網路上有找到一些連結但怕有病毒不敢下載,所以最後用虛擬機安裝了 XP,然後到 WINDOWS/System32 資料夾內將程式複製出來。

DOSbox

因為 debug.exe 無法在 Win10 執行,所以需要安裝 DOSbox 模擬器,下載 連結
測試時另外發現下載的 link.exe 也需要模擬器才能執行。[1]

  • 使用方式:
  1. DOSbox 需要指定一個資料夾當工作目錄才能運行,使用 MOUNT 指令將工作目錄掛載到 DOSbox 的 C: 上,D:\asm 是工作目錄的路徑。
  2. 接著將命令視窗位置移動到 C: 上。
MOUNT C D:\asm
C:

https://ithelp.ithome.com.tw/upload/images/20181016/201068651NjIBSrA2F.jpg

為了避免每次開啟需都要輸入指令,可以將指令加入設定檔,以後開啟程式後就會自動執行這兩行指令。

  1. 開啟安裝目錄,預設路徑 C:\Program Files (x86)\DOSBox-0.74
  2. 點擊兩下 DOSBox 0.74-2 Options.bat
  3. 在文件內找到 [autoexec] 加入上方指令

Hello World

不免俗的也要來一個 Hello World 程式,不過大家不必現在就去了解程式碼含意,在之後的文章中會陸續和大家介紹。

首先將上面準備的程式都放入 D:\asm 資料夾,並新增 hello.asm

https://ithelp.ithome.com.tw/upload/images/20181016/20106865dmVrYG0fLT.jpg

在 hello.asm 加入程式碼:

; 定義數據段,存放數據
data segment
    ; db 是定義接下來的數據為單字節的意思,
    ; '$'是字串的結尾,類似 C 的 '\0'
    string db 13,10,'Hello World!',13,10,'$'
data ends

; 定義代碼段,執行的程式碼
code segment
    ; 偽指令,告訴組譯器代碼段的對應
    assume cs:code, ds:data
start:
    mov ax, data     ; 將 data 的地址放到 ax 暫存器
    mov ds, ax       ; 將 ax 的值放到 ds 暫存器
    lea dx, string   ; 將 string 變數的地址放進 dx 暫存器
    mov ah, 09h      ; 09h 對應的是將字串輸出到螢幕上
    int 21h          ; 調用系統功能,對應的是目前 ah 暫存器中的值

    mov ax, 4c00h    ; 退出程式
    int 21h          ; 調用系統功能
code ends

end start   ; 讓組譯器知道程式的進入點

開啟 DOSBox 執行下方 masm 指令,成功後可以看到資料夾多了一個 HELLO.OBJ 檔案。

masm hello.asm

接著執行 link 連結 obj 檔案,成功後就會看到 HELLO.EXE 執行檔。

link hello.obj

執行檔無法在 Win10 執行,所以需要在 DOSBox 中開啟。

hello.exe

成功完成了我們的第一個 Hello World 程式!!!

https://ithelp.ithome.com.tw/upload/images/20181016/20106865J4zDxIjJAR.jpg

結語

第一篇先將環境設定好,並完成了第一個 Hello World 程式,下一篇會開始介紹理論,今天就到這裡摟,感謝大家觀看。

參考文章

[1] Windows10下搭建汇编语言开发环境(利用DOSBOX和MASM32)
[2] 汇编与逆向基础:Windows 7 64位环境下搭建汇编开发环境


下一篇
[Day02] CPU 如何和外部溝通 - 存儲器和總線
系列文
8086下16位元DOS組合語言學習筆記12
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
1
Homura
iT邦高手 1 級 ‧ 2018-10-16 20:09:10

恭喜開賽了!
主題剛好是求學期間我沒學好的組語
一起加油吧/images/emoticon/emoticon58.gif

感謝,一起加油~ /images/emoticon/emoticon37.gif

2
神Q超人
iT邦研究生 5 級 ‧ 2018-10-16 21:32:53

壓軸登場!
一起加油/images/emoticon/emoticon69.gif

哈哈哈,太誇張了拉。 /images/emoticon/emoticon16.gif

0
dannylin
iT邦新手 5 級 ‧ 2022-12-09 10:44:51

好文! 在Visual studio code可以安裝擴充套件MASM/TASM以執行ASM code。

謝謝!

0
Pi
iT邦新手 5 級 ‧ 2023-01-13 16:27:10

獲益很多! 感謝!

謝謝!

我要留言

立即登入留言